<?php
namespace app\api\controller;
use think\App;
use think\facade\View;
use think\facade\Db;
use think\facade\Request;
use think\facade\Cache;

class Member extends Base{
    public $member;//用户
    public $member_id;//用户id
    private $newToken;//用户传递给接口，便于客户端更新token字段
    private $expireDate=1800;//token过期时间(s)
    private $loginStatus=1;//1为登录正常，0为登录异常
    private $loginError="";//错误提示
    public function __construct(App $app)
    {
        parent::__construct($app);
        $this->checkLogin();
    }
    //校验用户登录信息
    private function checkLogin(){
        $memberInfo=$_SERVER['HTTP_MEMBERINFO'];//注意这里的键名必须要大写
        $memberInfo=  json_decode($memberInfo);
        if(!$memberInfo->member_id||!$memberInfo->token){
            $this->loginStatus=0;
            $this->loginError="用户登录信息不存在";
        }
        //校验token是否正常
        $member_r=Db::name("member")->find($memberInfo->member_id);
        $login_r=Db::name("member_login")->where([
            "member_id"=>$memberInfo->member_id,
            "device"=>$memberInfo->device,
        ])->find();
        //判断当前设备登录信息是否存在
        if(!$login_r){
            $this->returnResult(0,"登录信息不存在");
        }
        $cache_token=Cache::get('cache_token_'.$memberInfo->device);
        //注意这里需要校验两个token，旧的token要保存5分钟，解决客户端并发请求的时候第二个请求会因为token过期而拒绝这个问题
        if($login_r['token']!=$memberInfo->token&&$cache_token!=$memberInfo->token){
            $this->returnResult(0,"账号已在其它设备登录，或者登录信息已过期，请重新登录");
        }
        $this->member_id=$memberInfo->member_id;
        $this->member=$member_r;
        $this->login_r=$login_r;
        //更新token信息
        if(time()-$login_r['token_time']>$this->expireDate){
            $MemberLoginModel= new \app\api\model\MemberLoginModel();
            $newtoken=$MemberLoginModel->SetLoginToken($memberInfo->member_id,$memberInfo->device);
            $this->newToken=$newtoken;
            //同时要把旧的token缓存5分钟，便于客户端业务的平滑过渡（参考微信的access_token）
            Cache::set('cache_token_'.$memberInfo->device,$login_r['token'],300);
        }else{
            $newtoken="";
        }
        $this->returnResult(1,'',$newtoken);
    }
    //返回状态方法
    private function returnResult($loginStatus=0,$loginError="",$newToken=""){
        header('loginStatus:'.$loginStatus);
        header('newToken:'.$newToken);
        if(!$loginStatus){
            $this->error($loginError);
        }
    }
}
